网站搜索

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

相关文章