2021/07/27

Specific String On Typescript

ไปŠๅคฉๅœจๅฏซ anguar ็š„ๆ™‚ๅ€™ๆƒณๅˆฐไธ€ๅ€‹ๅ•้กŒ,ไธ€่ˆฌๆˆ‘ๅ€‘ๅœจ parameter ๅพŒ้ขๅธถ็š„ๆœƒๆ˜ฏๅž‹ๅˆฅ,ๅƒๆ˜ฏ:

const tester = (params: { name: string }): void => {
    console.log(params.name);
}

tester({name: 'a'}); // a

้‚ฃๆ˜ฏๅฆๅฏไปฅ็›ดๆŽฅ้™ๅฎšๆƒณ่ฆ็š„ๅ…งๅฎน,็ญ”ๆกˆๆ˜ฏๅฏไปฅ็š„:

const tester = (params: { name: 'a' | 'b' }): void => {
    console.log(params.name);
}
  
tester({name: 'a'}); // a

ๆญคๆ™‚ๅฆ‚ๆžœไฝ ไธ‹ tester({name: 'c'}); ๆœƒๅพ—ๅˆฐ TS2322: Type '"c"' is not assignable to type '"a" | "b"'. ็š„่ญฆๅ‘Š,ไธ้Žๅคšๅฏซไบ†ๅนพๅ€‹ๆกˆไพ‹ไปฅๅพŒ็™ผ็พไธ€ๅ€‹้›ท,ไธ่ƒฝ็”จ่ฎŠๆ•ธๅธถๅ…ฅ:

const tester = (params: { name: 'a' | 'b' }): void => {
    console.log(params.name);
}
const params = {
    name: 'a'
};

tester(params); // a

ไธŠๆ–น็š„ๅฏซๆณ•ๆœƒๅพ—ๅˆฐ่ญฆๅ‘Š TS2345: Argument of type '{ name: string; }' is not assignable to parameter of type '{ name: "a" | "b"; }'. Types of property 'name' are incompatible. Type 'string' is not assignable to type '"a" | "b"'.,ๆœ€็ฐกๅ–ฎ็š„่งฃๆณ•ๆ˜ฏ:

const tester = (params: { name: 'a' | 'b' }): void => {  
    console.log(params.name);
}
const params = {
    name: 'a' as const
};

tester(params); // a

ไธ้ŽไธŠ็คพ็พค่จŽ่ซ–ๅพŒ,ๆœ€ๅฅฝ็š„่งฃๆณ•ๆ‡‰่ฉฒๆ˜ฏ็”จ enum:

enum TesterParam {
    A = 'a',
    B = 'b'
}

const tester = (params: { name: TesterParam }): void => {
    console.log(params.name);
}
const params = {
    name: TesterParam.A
};

tester(params); // a

้€™ๆจฃ็š„ๆžถๆง‹ๅฐ็ถญ่ญทไพ†่ชชๆ˜ฏๆœ€ๅฅฝ็š„。