javascript - TypeScriptにオブジェクトのプロパティがundefinedにならないことを理解させるには?
ここでこれを聞いています、なぜならどう言えば Google が理解するかわからないからです。
文字列内の単語を大文字にするユーティリティ関数があり、2番目の引数としてオプションのオブジェクトを渡すことができます:
export type Options = {
onlyFirstWord?: boolean;
separator?: string;
};
const defaultOptions = {
onlyFirstWord: false,
separator: " ",
};
export default function capitalize(
str: string,
options: Options = defaultOptions
) {}
第二の引数はオプションです。なぜなら、そのためのデフォルト値を提供しているからです。しかし、型でプロパティをオプションにすると、それらが未定義かどうかをチェックする必要があります。デフォルト値があるため、それらが100%未定義になることはありえないのにです。しかし、オプションをオプションにしなければ、オプションオブジェクトを渡すときにすべてのプロパティを入力しなければならず、そうしないとエラーになります。
似たような質問が多いことはわかっていますが、この場合、感嘆符を付けるかオプショナルチェーンを使う以外に、TypeScript にこれらの値が決して undefined ではないと伝える方法はないのでしょうか?デフォルト値を提供しているので、TypeScript は自動的にこれらが決して undefined ではないと判断してくれないのでしょうか?ありがとうございます。また、もしこれは重複で既に回答されている場合は教えてください。
回答 #1
こちらは動作する解決策へのプレイグラウンドのリンクです。
コードは以下にコピーされており、コメント付きです:
// remove the ?'s from the Options type
type Options = {
onlyFirstWord: boolean;
separator: string;
};
const defaultOptions = {
onlyFirstWord: false,
separator: "default",
};
// use this function to merge default options with Partial options
const createDefaultOptions = (options: Partial<Options>) => {
return {...defaultOptions, ...options};
}
// allow the capitalize function to take Partial options
function capitalize(
str: string,
options: Partial<Options> = defaultOptions
) {
// merge the given options with the partial options
const opts = createDefaultOptions(options);
// print the result
console.log(`${str}: ${opts.onlyFirstWord}, ${opts.separator}`);
}
// tests
capitalize('nothing');
capitalize('first', {onlyFirstWord: true});
capitalize('second', {separator: 'j'});
capitalize('both', {onlyFirstWord: true, separator: 'nice'});
出力 :
nothing: false, default
first: true, default
second: false, j
both: true, nice
