javascript - 如何让 TypeScript 理解对象属性不能为 undefined?
在这里问这个问题,因为不确定如何正确表达才能让谷歌理解。
我有一个用于将字符串中的单词首字母大写的工具函数,它可以作为第二个参数传入一个选项对象:
export type Options = {
onlyFirstWord?: boolean;
separator?: string;
};
const defaultOptions = {
onlyFirstWord: false,
separator: " ",
};
export default function capitalize(
str: string,
options: Options = defaultOptions
) {}
所以第二个参数是可选的,因为我已经为它提供了默认值,但如果我在类型中将属性设为可选,则需要检查它们是否为 undefined,即使它们绝对不可能是 undefined,因为有默认值。但如果我不将它们设为可选,则在传递 options 对象时必须输入每一个属性,否则会报错。
我知道有很多类似的问题,但在这种情况下,除了必须加感叹号或使用可选链之外,难道没有办法告诉 TypeScript 这些值永远不会是 undefined 吗?既然我为它提供了默认值,它不应该自动判断出它们永远不会是 undefined 吗?谢谢,如果这是重复问题并且已经有人回答过,请告诉我。
答案#1
这里有一个指向可运行解决方案的 Playground 链接。
代码如下所示,并附有注释:
// 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
